Skip to content

Conversation

@waleedlatif1
Copy link
Collaborator

Summary

  • Fix Gemini API error when tools return primitive values (boolean, string, number, null)
  • Add ensureStructResponse utility to wrap primitives in { value: ... } for functionResponse.response
  • Apply fix to both message history conversion and direct tool execution paths

Type of Change

  • Bug fix

Testing

  • Added 24 unit tests for the fix
  • Tested manually

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@vercel
Copy link

vercel bot commented Jan 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Review Updated (UTC)
docs Skipped Skipped Jan 20, 2026 3:39pm

Request Review

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 20, 2026

Greptile Summary

Fixed Gemini API error when tools return primitive values by wrapping them in objects. The Gemini API requires functionResponse.response to be a google.protobuf.Struct (object with string keys), but tools can return primitives (booleans, strings, numbers, null) or arrays which are not valid Struct values.

  • Added ensureStructResponse utility in apps/sim/providers/google/utils.ts that wraps primitives and arrays in { value: ... } format
  • Applied fix in two critical paths:
    1. Direct tool execution in apps/sim/providers/gemini/core.ts at line 108
    2. Message history conversion in convertToGeminiFormat at line 200
  • Added comprehensive test coverage with 24 unit tests covering all primitive types, arrays, objects, and edge cases

This ensures compatibility with Gemini's strict type requirements while preserving the ability for tools to return any JSON-serializable value.

Confidence Score: 5/5

  • This PR is safe to merge with minimal risk
  • The fix addresses a specific API compatibility issue with a focused, well-tested solution. The implementation is clean with proper type safety, comprehensive test coverage (24 unit tests), and handles all edge cases. Both execution paths are covered.
  • No files require special attention

Important Files Changed

Filename Overview
apps/sim/providers/google/utils.ts Added ensureStructResponse utility to wrap primitives/arrays in { value: ... } and applied in convertToGeminiFormat for Gemini API compatibility
apps/sim/providers/gemini/core.ts Applied ensureStructResponse to tool execution results at line 108 to ensure proper Gemini API format
apps/sim/providers/google/utils.test.ts Comprehensive test coverage with 24 unit tests for ensureStructResponse and convertToGeminiFormat with primitive tool responses

Sequence Diagram

sequenceDiagram
    participant Tool as Tool Execution
    participant Core as Gemini Core
    participant Utils as ensureStructResponse
    participant API as Gemini API
    
    Tool->>Core: executeTool returns primitive (boolean/string/number/null)
    Core->>Utils: ensureStructResponse(result.output)
    
    alt Input is object (not array)
        Utils-->>Core: Return as-is
    else Input is primitive or array
        Utils-->>Core: Wrap in { value: ... }
    end
    
    Core->>API: functionResponse.response with wrapped value
    API-->>Core: Success (Struct format validated)
    
    Note over Utils,API: History path (convertToGeminiFormat)
    
    Tool->>Utils: Tool message with primitive content
    Utils->>Utils: JSON.parse(content)
    Utils->>Utils: ensureStructResponse(parsed)
    
    alt Parsed is object
        Utils-->>API: Return as-is
    else Parsed is primitive/array
        Utils-->>API: Wrap in { value: ... }
    end
Loading

@waleedlatif1 waleedlatif1 merged commit 07f0c01 into staging Jan 20, 2026
12 checks passed
@waleedlatif1 waleedlatif1 deleted the fix/google branch January 20, 2026 17:27
waleedlatif1 added a commit that referenced this pull request Jan 21, 2026
* fix(google): wrap primitive tool responses for Gemini API compatibility (#2900)

* fix(canonical): copilot path + update parent (#2901)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output (#2902)

* fix(rss): add top-level title, link, pubDate fields to RSS trigger output

* fix(imap): add top-level fields to IMAP trigger output

* improvement(browseruse): add profile id param (#2903)

* improvement(browseruse): add profile id param

* make request a stub since we have directExec

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels (#2880)

* improvement(executor): upgraded abort controller to handle aborts for loops and parallels

* comments

* improvement(files): update execution for passing base64 strings (#2906)

* progress

* improvement(execution): update execution for passing base64 strings

* fix types

* cleanup comments

* path security vuln

* reject promise correctly

* fix redirect case

* remove proxy routes

* fix tests

* use ipaddr

* feat(tools): added textract, added v2 for mistral, updated tag dropdown (#2904)

* feat(tools): added textract

* cleanup

* ack pr comments

* reorder

* removed upload for textract async version

* fix additional fields dropdown in editor, update parser to leave validation to be done on the server

* added mistral v2, files v2, and finalized textract

* updated the rest of the old file patterns, updated mistral outputs for v2

* updated tag dropdown to parse non-operation fields as well

* updated extension finder

* cleanup

* added description for inputs to workflow

* use helper for internal route check

* fix tag dropdown merge conflict change

* remove duplicate code

---------

Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>

* fix(ui): change add inputs button to match output selector (#2907)

* fix(canvas): removed invite to workspace from canvas popover (#2908)

* fix(canvas): removed invite to workspace

* removed unused props

* fix(copilot): legacy tool display names (#2911)

* fix(a2a): canonical merge  (#2912)

* fix canonical merge

* fix empty array case

* fix(change-detection): copilot diffs have extra field (#2913)

* improvement(logs): improved logs ui bugs, added subflow disable UI (#2910)

* improvement(logs): improved logs ui bugs, added subflow disable UI

* added duplicate to action bar for subflows

* feat(broadcast): email v0.5 (#2905)

---------

Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants